// 网络请求的封装
import axios from 'axios' // 引入axios插件

// 创建一个axios实例，并为其设置一些基础的配置参数
const instance = axios.create({
  // 设置请求超时时间，如果用户因网络问题等请求时间超过5s仍未请求成功就会报错
  timeout: 5000,
  // baseURL表示我们请求api时候的基地址，此地址会拼接上请求中的url
  // 比如说在products.js中get('/api/v1/products', { page: page }),设置了baseURL后请求的地址会拼上axios实例instance发送请求的url，相当于发送请求的地址是http://localhost:3009/api/v1/products

  baseURL: 'http://localhost:3009'
})
// Interceptors拦截器
// 15-58行代码是直接复制的https://github.com/axios/axios#axios-api里的interceptor，然后进行修改
// 全局请求拦截，所有的网络请求发起之前都会走这里
// Add a request interceptor
instance.interceptors.request.use(
  function(config) {
    // Do something before request is sent
    // console.log('请求执行之前')
    // 请求时给请求头添加一个aaa属性值为hahaha
    // 这样当我们请求时可以在请求头中添加一个token，
    // 登陆成功后把token信息存贮在localstroge或cookie
    config.headers.aaa = 'hahaha'
    return config
  },
  function(error) {
    // Do something with request error
    return Promise.reject(error)
  }
)

// 全局响应拦截，所有的网络请求返回之后都会走这里
// Add a response interceptor
instance.interceptors.response.use(
  function(response) {
    // Any status code that lie within the range of 2xx cause this function to trigger
    // Do something with response data
    // console.log('请求执行完成')
    // response 表示后端返回的结果，可以在此对结果进行处理，这样其他的页面拿到的就是经响应拦截处理过的数据
    // console.log(response)
    // console.log(response.data)
    return response.data
    // return response.data
  },
  function(error) {
    // Any status codes that falls outside the range of 2xx cause this function to trigger
    // Do something with response error
    // console.dir(error) // 以树形结构的形式打印响应错误的信息(比如请求时间设置1s)
    // 请求时间超时时的错误处理
    // 字符的indexof操作有没有timeout值为-1，有则返回timeout字符在error.message中的索引，大于-1说明有，有说明是请求超时了
    // if (error.message.indexOf('timeout') > -1) {
    //   alert('网络不稳定，请稍后重试')
    // }
    // 常见的状态码：404提示页面找不到，401未授权，200成功
    return Promise.reject(error)
  }
)

// function后面的get是我们定义的方法名
// instance后的get是axios实例发送的get请求
// 比如get("http:baidu",2)表示执行get方法，执行时返回的是
// instance.get(url, { params })的axios请求，既发送了一个get请求
/***
 *  发起一个get请求
 * url:表示请求地址
 * params：表示传递的参数
 * get请求获取数据
 */
// 将instance导出
export default instance
export function get(url, params) {
  return instance.get(url, { params })
}
// 简写
// export const get = (url, params) => instance.get(url, { params })

/***
 *  发起一个post请求
 * url:表示请求地址
 * data：表示传递的参数
 * post请求添加数据
 */
export function post(url, data) {
  return instance.post(url, data)
}
/***
 *  发起一个put请求
 * url:表示请求地址
 * data：表示传递的参数
 * put请求,修改数据
 */
export function put(url, data) {
  return instance.put(url, data)
}
/***
 *  发起一个del请求
 * url:表示请求地址
 * data：表示传递的参数
 *  del请求，删除数据
 */
export function del(url) {
  return instance.delete(url)
}
